NestJS で DI してもらう時は Type-Only Import を使ってはいけない
#technology #NestJS #TypeScript
NestJS では DI してもらいたいサービスのコンストラクタに欲しいサービスを引数を書くだけで自動的に必要な依存が注入される
code:someService.ts
import { Injectable } from '@nestjs/common'
import { HogeService } from './hoge.service'
import { PiyoService } from './piyo.service'
@Injectable()
export class SomeService() {
constructor(
private readonly hoge: HogeService,
private readonly piyo: PiyoSerivce,
) {}
public doSomething() {
this.hoge.something()
const poge = this.piyo.something
}
}
一見すると注入してもらうサービスは型を書くだけで実態は使っていないようなので、Type-Only Import でも問題なさそうに思える
code:someService.ts
import type { HogeService } from './hoge.service' // とか
import { type PiyoService } from './piyo.service' // 新しく増えた記法とか
しかし Type-Only Import だとサービスをうまく解決できず、DI に失敗する。
というのも、Type-Only Import は tsc がコンパイル時に eliminate してしまうので import 文が残らず、結果としてどのサービスを要求していたのか分からなくなってしまう。
Nest dependency injection can't resolve type-only imports · Issue #5421 · nestjs/nest · GitHub
/tosuke/tosuke.icon https://www.typescriptlang.org/tsconfig#emitDecoratorMetadata これでメタデータが付与されるけど該当のシンボルがないのでundefinedが登録されて壊れるんだと思う
確かに、__decorate の paramtypes が滅茶苦茶になりそう
ちなみに rokoucha.icon はこれに気付かず1時間ぐらい発狂しました♪